Wprowadzenie do pakietu ggplot2

Przemyslaw Biecek

Przygotowanie danych

Zanim zaczniemy tworzyć pierwszy wykres, musimy przygotować dane do rysowania. Dane można przygotować na wiele sposobów, najprostszym z nich jest użycie pakietu dplyr.

library(dplyr)
con <- url("http://biecek.pl/MIMUW/cenyAutI2012.Rdata")
print(load(con))
## [1] "cenyAutI2012"
wybraneAuta <- cenyAutI2012 %>% 
          filter(Marka %in% c("Volkswagen", "Opel", "Audi", "Mercedes-Benz", "BMW"))

avgs <- wybraneAuta %>% 
          group_by(Marka, Rok.produkcji) %>%
          summarise(cena = median(Cena.w.PLN, na.rm=TRUE),
                    przebieg = median(Przebieg.w.km, na.rm=TRUE),
                    liczba = n()) %>%
          filter(liczba >= 10)
avgs
## Source: local data frame [143 x 5]
## Groups: Marka
## 
##    Marka Rok.produkcji cena przebieg liczba
## 1   Audi          1987 2400   253000     16
## 2   Audi          1988 2200   239000     17
## 3   Audi          1989 2500   240000     21
## 4   Audi          1990 2600   254500     38
## 5   Audi          1991 4000   214575     57
## 6   Audi          1992 4650   227000    114
## 7   Audi          1993 5500   230000    131
## 8   Audi          1994 6250   233566    152
## 9   Audi          1995 7900   215000    286
## 10  Audi          1996 8900   209000    395
## ..   ...           ...  ...      ...    ...

Pierwszy wykres

W pakiecie ggplot2 wykresy można tworzyć na dwa sposoby:

  • z użyciem funkcji qplot (q like quick), proste wykresy tworzy się prosto, ale bardziej trudniej,
  • z użyciem funkcji ggplot(), z początku może nie jest zbyt intuicyjna, ale po pewnym czasie nasza intuicja się zmienia.

Nam zależy nam na profesjonalnej grafice, więc będziemy pracować z funkcją ggplot().

Zaczniemy od wykresy punktowego.

library(ggplot2)
ggplot(avgs, aes(x=przebieg, y=cena)) +
    geom_point()

plot of chunk unnamed-chunk-2

Funkcja ggplot wymaga określenia dwóch argumentów: zbioru danych oraz zbioru mapowań (aesthetic mappings, funkcja aes()). Wybrawszy dane i mapowania można przejść do opisu geometrii.

Grafika produkowana przez pakiet ggplot jest nazywana ‘high quality elegant graphics’ (przynajmniej przez entuzjastów tego pakietu). Zobaczmy dlaczego. Porównajmy dwa wykres z dwóch bibliotek programu R, oba wykresy z domyślnymi ustawieniami. Oba wykresy rysujemy na obszarze 4x4 cale.

plot(avgs$przebieg, avgs$cena)          # base graphics
ggplot(avgs, aes(x=przebieg, y=cena)) + # ggplot graphics
    geom_point()

plot of chunk unnamed-chunk-3plot of chunk unnamed-chunk-3

Twoja kolej:

ZnajdŸ przynajmniej trzy różnice pomiędzy tymi wykresami

Kluczowe elementy wykresu

Key components

  • jedna lub kilka geometrii. Geometrie określają w jaki sposób dane będą reprezentowane.
  • mapowania, określają w jaki sposób dane są przekształcane na cechy wykresu
  • skale, określają jak wygląda mapowanie, jaka jest jego dziedzina,
  • panele warunkowe, pozwalają na zestawienie wyników dla różnych grup,
  • układ współrzędnych wykresu,
  • dodatkowe elementy wykresu.

Geometrie

Myśląc o wykresie, w pierwszym kroku myślimy o jego geometrii.

Pakiet ggplot pozwala na wybór spośród wielu geometrii. Ich lista jest dostępna na stronie http://docs.ggplot2.org/current/. Na tych zajęciach będziemy pracować z kilkoma najpopularniejszymi, ale z pozostałych korzysta się w bardzo podobny sposób.

Dwie ciągłe zmienne

Przyjrzyjmy się na początek trzem geometriom: geom_point(), geom_text(), geom_smooth().

W dokumentacji dla każdej geometrii można zobaczyć jakie właœściwoœści tej geometrii można określić.

Dla geom_text trzy obowiązkowe to x, y i label. http://docs.ggplot2.org/current/geom_text.html.

tylkoAudi <- avgs %>%
  filter(Marka == "Audi")

ggplot(tylkoAudi, aes(x=przebieg, y=cena)) +
  geom_point()

plot of chunk unnamed-chunk-4

ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text()

plot of chunk unnamed-chunk-4

A co z nieobowiązkowymi mapowaniami? Też mogą być przydatne.

ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text(aes(size=liczba))

plot of chunk unnamed-chunk-5

ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text(aes(size=liczba), hjust=1, vjust=0) +
  geom_point()

plot of chunk unnamed-chunk-5

W kolejnych krokach, można dopracowywać szczegóły, np. etykiety na osiach.

library(scales)
ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text(aes(size=liczba)) +
  scale_x_continuous(labels = comma) +
  scale_y_continuous(labels = comma)

plot of chunk unnamed-chunk-6

Uwaga, mapuje się tylko zmienne. Pojedyncze wartości / stałe określa się inaczej.

ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text(aes(size=5)) 

plot of chunk unnamed-chunk-7

ggplot(tylkoAudi, aes(x=przebieg, y=cena, label=Rok.produkcji)) +
  geom_text(size=5) 

plot of chunk unnamed-chunk-7

geom_smooth()

Pracując ze zmiennymi ciągłymi, szukając zależności typu regresyjnego, jedną z ciekawszych geometrii jest geom_smooth().

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
    geom_smooth() 

plot of chunk unnamed-chunk-8

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
    geom_smooth()  + xlim(1980,2012) 

plot of chunk unnamed-chunk-8

Usuniemy teraz przedział ufności dla średniej i dodajmy punkty do wykresu (kolejną geometrię).

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
  geom_point(alpha=0.5) +
  geom_smooth(se = FALSE, size=5, colour="red")  + 
  xlim(1980,2012) + ylim(0,200000)

plot of chunk unnamed-chunk-9

Zauważmy, że geom_smooth() nie tylko wygładza. Można dodatkowymi parametrami określić jaki model regresyjny ma być przedstawiony na wykresie.

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
    geom_point(alpha=0.4) +
    geom_smooth(se = FALSE, size=2) +
    geom_smooth(se = FALSE, size=2, method = "lm", colour="red") +
    geom_smooth(se = FALSE, size=2, method = "lm", colour="green", formula = y ~ poly(x,2)) + 
  xlim(1980,2012) + ylim(0,200000)

plot of chunk unnamed-chunk-10 Zmieniamy stopień wygładzenia.

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN)) +
    geom_point(alpha=0.4) +
    geom_smooth(se = FALSE, size=2, colour="blue", span=0.9, method="loess") +
    geom_smooth(se = FALSE, size=2, colour="red", span=0.1, method="loess") + 
  xlim(1980,2012) + ylim(0,200000)

plot of chunk unnamed-chunk-11

Składając różne mapowania i geometrie można uzyskać bardzo ciekawe rozwiązania

ggplot(wybraneAuta, aes(x=Rok.produkcji, y=Cena.w.PLN, colour=Marka)) +
    geom_point(alpha=0.4) +
    geom_smooth(se = FALSE, size=2) + 
  xlim(1980,2012) + ylim(0,200000)

plot of chunk unnamed-chunk-12

Dla zmiennych jakościowych

Wykresy paskowe i ich odmiany są wygodne w przedstawianiu zmiennych jakościowych. Jako przykład wykorzystamy geom_bar().

ggplot(wybraneAuta, aes(x=Rok.produkcji)) +
  geom_bar() 

plot of chunk unnamed-chunk-13

# horizontal or vertical?
ggplot(wybraneAuta, aes(x=Rok.produkcji)) +
  geom_bar() +
  coord_flip() 

plot of chunk unnamed-chunk-13

ggplot(wybraneAuta, aes(x=Marka)) +
  geom_bar() 

plot of chunk unnamed-chunk-13

# horizontal or vertical?
ggplot(wybraneAuta, aes(x=Marka)) +
  geom_bar() +
  coord_flip() 

plot of chunk unnamed-chunk-13

Zobacz jakie parametry geometrii geom_bar() można modyfikować http://docs.ggplot2.org/current/geom_bar.html.

Jednym z takich parametrów jest ‘position’.

ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
    geom_bar() + coord_flip()

plot of chunk unnamed-chunk-14

# Position = dodge
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
    geom_bar(position="dodge") + coord_flip()

plot of chunk unnamed-chunk-14

# Position = fill
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
    geom_bar(position="fill") + coord_flip()

plot of chunk unnamed-chunk-14

# Procenty na osi OX
ggplot(wybraneAuta, aes(x=Marka, fill=Rodzaj.paliwa)) +
    geom_bar(position="fill") + coord_flip() + 
    scale_y_continuous(label=percent)

plot of chunk unnamed-chunk-14

Inne geometrie

Liczba geometrii dostępnych w pakiecie ggplot2 się zmienia. Czasem przybywają nowe, nadmiarowe geometrie mogą zostać zredukowane. W dodatkowych pakietach można również znaleźć nowe geometrie.

Aby sprawdzić jaka jest aktualna lista geometrii najlepiej odwiedzić stronę http://docs.ggplot2.org/current/.

ggplot(wybraneAuta, aes(y=Przebieg.w.km, x=Rodzaj.paliwa)) +
  geom_boxplot() + ylim(0,300000) 

plot of chunk unnamed-chunk-15

ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
  geom_density() + xlim(0,300000) 

plot of chunk unnamed-chunk-15

ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
  geom_density(alpha=0.5) + xlim(0,300000) 

plot of chunk unnamed-chunk-15

ggplot(wybraneAuta, aes(x=Przebieg.w.km, fill=Rodzaj.paliwa)) +
  geom_histogram() + xlim(0,300000) 

plot of chunk unnamed-chunk-15

Inne źródła